Data processing systems and particularly microprocessor devices may include multiple processors which share system address and data buses. Each processor in such a multiple processor system commonly includes its own cache memory. Although each processor may include separate cache memory, each processor in the system may be allowed to address any particular line in cache memory, even a line of data currently stored at a cache location in another processor. Multiple processor systems which allow the various processors to address any cache location in the system must also include some arrangement for coordinating the use of cache memory to maintain "cache coherency" in the system. As used in this disclosure, "cache coherency" means generally the control of various cache memory locations necessary to facilitate proper system operation.
Processor systems which require high address bus throughput typically "pipeline" address bus operations. In these pipelined address buses, operations from the various processors are processed or held in a series of pipeline stages. Each pipeline stage requires one address bus clock cycle, and a different address operation is processed at each different pipeline stage during each given period. The number of address bus clock cycles it takes for an address operation to be processed through the pipelined address bus may be referred to as the address tenure on the bus.
In multiple processor systems which utilize a shared address bus, only a single address operation from one of the processors may enter the address bus pipeline in any given clock cycle. An address bus arbitration arrangement selects which particular processor may drive an address operation into the first stage of the pipelined address bus in a given clock cycle. Since the address bus is shared, that is, connected to each processor, each processor which is not selected by the address bus arbitration arrangement receives or "sees" the address operation which enters the pipeline address bus from a different processor. These receiving processors are said to "snoop" the operation entering the address bus pipeline from another processor. Both the address specified in an operation entering the address bus pipeline and other information such as an operation type may be snooped by the other processors sharing the address bus. The operation snooped on a shared address bus is commonly referred to as a snoop operation or query. The address and operation type specified in a snoop operation may be referred to as a snoop address and a snoop type, respectively.
Cache coherency in a multiple processor system is maintained by the processor which "owns" the data at a particular address. Ownership is defined according to a suitable protocol under which a system is designed to operate. The protocol determines how a first processor responds to a conflicting operation from another processor. A "conflicting operation" in this sense refers to an operation specifying the same address owned by another processor. According to one protocol, when a first processor "owns" data at a particular address and snoops a conflicting operation from a second processor, the first processor transmits a retry snoop response to the second processor. This retry snoop response lets the second processor know that it may not have the data at the specified location at that time. Multiple processor systems are designed such that each processor placing an address operation on the pipelined address bus in a given clock cycle will receive a snoop response to the action within a given number of address bus clock cycles. The number of clock cycles in which a snoop response will be received is referred to as the "snoop response window."
For some operations, ownership of a particular cache block is declared after the operation completes the snoop response window without receiving a retry snoop response from another processor. However, ownership is not claimed during the address tenure itself. That is, ownership of the specified cache block is not claimed between the address bus clock cycle in which the address operation enters the address pipeline and the clock cycle in which the address operation finishes the pipeline.
Since a first processor does not have ownership of a cache block during the address tenure of certain types of operations that the processor may issue, the first processor does not recognize immediately if it should issue a retry snoop response to a conflicting address operation from another processor. It is only after the first processor passes its own snoop response window without receiving a retry response that the first processor knows with certainty that it has obtained ownership of the cache block and thus that it should transmit a retry snoop response to the processor issuing the younger conflicting address bus operation.
This uncertainty during the address tenure of an operation presents a problem as to the appropriate response to younger conflicting address bus operations which are snooped from the shared address bus. Simply retrying each younger conflicting address bus operation would result in unnecessarily retried operations since the processor prompting the retry response might not actually obtain ownership of the address. On the other hand, dynamically calculating the appropriate snoop response after address bus tenure could slow system throughput and would require substantial resources in terms of registers and logic elements.